package com.baizhi.action;

import com.baizhi.entity.Product;
import com.baizhi.service.ProductService;
import com.baizhi.service.impl.ProductServiceImpl;
import org.apache.struts2.ServletActionContext;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class ProductAction {
    private Integer pageNum=1;
    private Integer pageSize=4;
    private Integer totalPage;
    private List<Product> products;
    private String pname;
    private Double price;
    private Product p;
    private Integer[] pids;
    private File cover;//上传图片的文件
    private String coverFileName;//上传图片的文件名

    public void setPs(ProductService ps) {
        this.ps = ps;
    }

    private ProductService ps;
//    添加
    public String addProduct(){
        //添加封面  就是要把封面上传到项目内存放封面的文件夹真实路径上
//		1、获取服务器存放图片文件的文件夹在项目运行的真实路径
        HttpServletRequest request = ServletActionContext.getRequest();
        //获取ServletContext对象
        ServletContext context = request.getServletContext();
        //获取img文件在服务器上的真实路径
        String realPath = context.getRealPath("/img");
//        System.out.println("img文件的路径"+realPath);
//      2、收参由cove和coverFileName属性完成  和UUID一起保证文件名唯一  获取唯一的真正的文件名
        String realCoverFileName = UUID.randomUUID().toString()+coverFileName;
//      3、文件复制
        InputStream is = null;
        OutputStream os = null;
        try {
            //源文件放进文件字节输入流
            is = new FileInputStream(cover);
            //文件输出到服务器的cove文件夹内（项目真实运行的路径下）
            os = new FileOutputStream(realPath+"/"+realCoverFileName);
            //边读边写 复制文件
            while(true){
                try {
                    int i = is.read();
                    if(i==-1) break;
                    os.write(i);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
//      4、然后将上传后的封面的真实文件名  封装到book对象
        p.setPicPath(realCoverFileName);
//        System.out.println("添加的商品图片名字"+p.getPicPath());
//      5、调用业务方法
        int i = ps.addProduct(p);
        return "success";
    }
//    删除一个
    public String removeOne(){
        int i = ps.deleteOneProduct(p.getPid());
        return "success";
    }
//    批量删删除
    public String removeAny(){
        int i = ps.deleteAnyProduct(pids);
        return "success";
    }
//    条件分页查询
    public String selectProducts(){
        System.out.println("查询商品的action");
        int i = ps.totalProduct(pname, price);
        totalPage = i%pageSize==0 ? i/pageSize:i/pageSize+1;
        products = ps.selectProductByCondition(pname, price, pageNum, pageSize);
        return "productlist";
    }
//    更新
    public String updateProduct(){
//        System.out.println("收参"+p);
        if(cover!=null){
            //添加封面  就是要把封面上传到项目内存放封面的文件夹（webapp下的cover）真实路径上
//		1、获取img文件夹在项目运行的真实路径
            HttpServletRequest request = ServletActionContext.getRequest();
            //获取ServletContext对象
            ServletContext context = request.getServletContext();
            //获取cover文件在服务器上的真实路径
            String realPath = context.getRealPath("/img");
//      2、收参由cove和coverFileName属性完成  和UUID一起保证文件名唯一  获取唯一的真正的文件名
            String realCoverFileName = UUID.randomUUID().toString()+coverFileName;
//      3、文件复制
            InputStream is = null;
            OutputStream os = null;
            try {
                //源文件放进文件字节输入流
                is = new FileInputStream(cover);
                //文件输出到服务器的cove文件夹内（项目真实运行的路径下）
                os = new FileOutputStream(realPath+"/"+realCoverFileName);
                //边读边写 复制文件
                while(true){
                    try {
                        int i = is.read();
                        if(i==-1) break;
                        os.write(i);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
//      4、然后将上传后的封面的真实文件名  封装到book对象
            p.setPicPath(realCoverFileName);
        }
//        5、调用修改业务方法
        int i = ps.updateProduct(p);
        return "success";
    }
//    查询一个  跳转到商品详情
    public String getOneProduct(){
        p = ps.selectById(p.getPid());
//        System.out.println("商品详情"+p);
        return "productDetail";
    }
//    查询一个  跳转到更新页面
    public String selectOneProduct(){
        p = ps.selectById(p.getPid());
//        System.out.println("获取要修改的商品对象"+p);
        return "updateJSP";
    }
//    上下架
    public String change(){
        p = ps.selectById(p.getPid());
//        System.out.println("上下架的商品对象"+p);
        if(p.getStatus()==0){
            p.setStatus(1);
        }else if(p.getStatus()==1){
            p.setStatus(0);
        }
        int i = ps.updateProduct(p);
//        System.out.println("更新上下架的商品对象"+p);
        return "success";

    }



    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public Product getP() {
        return p;
    }

    public void setP(Product p) {
        this.p = p;
    }

    public Integer[] getPids() {
        return pids;
    }

    public void setPids(Integer[] pids) {
        this.pids = pids;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public File getCover() {
        return cover;
    }

    public void setCover(File cover) {
        this.cover = cover;
    }

    public String getCoverFileName() {
        return coverFileName;
    }

    public void setCoverFileName(String coverFileName) {
        this.coverFileName = coverFileName;
    }
}
